<?php
/**
 * XPHP Framework
 *
 * LICENSE
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.

 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * @category	XPHP
 * @package		XPHP_Layout
 * @author		XWEB Dev Team
 * @copyright	Copyright (c) 2010-2011 XWEB. (http://xweb.vn)
 * @license		http://xphp.xweb.vn/license.html     GNU GPL License
 * @version		$Id: Layout.php 201011 2011-22-08 02:05:09 Mr.UBKey $
 */
/**
 * XPHP_Exception
 *
 * @see XPHP_Exception
 */
require_once 'XPHP/Exception.php';
/**
 * XPHP_Layout xử lý các vấn đề liên quan tới Layout
 *
 * @category	XPHP
 * @package		XPHP_Layout
 * @author		Mr.UBKey
 * @link		http://xphp.xweb.vn/user_guide/xphp_layout.html
 */
class XPHP_Layout
{
    /**
     * Router lưu thông tin về area, controller, action
     * @var XPHP_Router
     */
    protected $_router;
    /**
     * Tên thư mục chứa view
     * @var string
     */
    protected $_layoutDir = "Layouts";
    /**
     * Phần đuôi mở rộng của View
     */
    protected $_layoutExt = "phtml";
    /**
     * File layout
     * @var string
     */
    protected $_layoutFile = "";
    /**
     * View
     * @var XPHP_View
     */
    protected $_view;
    /**
     * Lớp khởi tạo View
     * @param XPHP_Router $router
     * @param XPHP_Layout $layout Tên layout
     */
    public function __construct (XPHP_Router $router, XPHP_View $view)
    {
        $this->_router = $router; // Gán Router
        $this->_view = $view;
    }
    public function setLayoutFile ($layoutFile)
    {
        $this->_layoutFile = $layoutFile;
    }
    public function getLayoutFile ()
    {
        return $this->_layoutFile;
    }
    /**
     * Lấy ra đường dẫn đến file layout
     */
    public function getLayoutPath ()
    {
        //Lấy ra area trong router
        $area = $this->_router->getArea();
        //Lấy ra đường dẫn tới thư mục
        $folder = $this->getLayoutFolder();
        //Đường dẫn tới thư mục
        $mobilePath = $this->getMobileLayoutPath();
        if (empty($area)) {
            if ($mobilePath)
                $path = $mobilePath;
            else
                $path = $folder . '/' . $this->_layoutFile . '.' .
                 $this->_layoutExt;
                 //Xử lý trả về kết quả
            if (is_file($path))
                return $path;
            else {
                throw new XPHP_Exception(
                "Không tìm thấy tệp tin Layout $path được load trong " .
                 $this->_router->getController() .
                 $this->_router->getControllerKey());
            }
        } else {
            //Kiểm tra xem có load layout tại Area khác hay không
            $pos = strpos($this->_layoutFile, "/");
            if (is_integer($pos)) {
                $layouts = explode("/", $this->_layoutFile);
                if ($layouts[0] != "") {
                    if ($this->_router->isArea($layouts[0])) {
                        $areaPath = $this->_router->getAreaPaths($layouts[0]);
                        $layoutName = $layouts[1];
                        if ($mobilePath)
                            $path = $mobilePath;
                        else
                            $path = $areaPath . '/' . $this->_layoutDir . '/' .
                             $layoutName . '.' . $this->_layoutExt;
                             //Xử lý trả về kết quả
                        if (is_file($path))
                            return $path;
                        else {
                            throw new XPHP_Exception(
                            "Không tìm thấy tệp tin Layout $path được load trong " .
                             $this->_router->getArea() . "_" .
                             $this->_router->getController() .
                             $this->_router->getControllerKey());
                        }
                    } else
                        throw new XPHP_Exception(
                        "Không tìm thấy Area có tên {$layouts[0]}.");
                } else {
                    //Load layout application
                    if ($mobilePath)
                        $path = $mobilePath;
                    else
                        $path = $this->_router->getApplicationDir() . '/' .
                         $this->_layoutDir . '/' . $this->_layoutFile . '.' .
                         $this->_layoutExt;
                         //Xử lý trả về kết quả
                    if (is_file($path))
                        return $path;
                    else {
                        throw new XPHP_Exception(
                        "Không tìm thấy tệp tin Layout $path được load trong " .
                         $this->_router->getArea() . "_" .
                         $this->_router->getController() .
                         $this->_router->getControllerKey());
                    }
                }
            } else {
                //Load layout tại thư mục mặc định của Area
                if ($mobilePath)
                    $path = $mobilePath;
                else
                    $path = $this->_router->getAreaPaths($area) . '/' .
                     $this->_layoutDir . '/' . $this->_layoutFile . '.' .
                     $this->_layoutExt;
                     //Xử lý trả về kết quả
                if (is_file($path))
                    return $path;
                else {
                    throw new XPHP_Exception(
                    "Không tìm thấy tệp tin Layout $path được load trong " .
                     $this->_router->getArea() . "_" .
                     $this->_router->getController() .
                     $this->_router->getControllerKey());
                }
            }
        }
    }
    /**
     * Lấy ra đường dẫn tới thư mục chứa layout
     */
    public function getLayoutFolder ()
    {
        //Lấy ra area trong router
        $area = $this->_router->getArea();
        if (empty($area)) {
            return $this->_router->getApplicationDir() . '/' . $this->_layoutDir;
        } else {
            $pos = strpos($this->_layoutFile, "/");
            if (is_integer($pos)) {
                $layouts = explode("/", $this->_layoutFile);
                if ($layouts[0] != "") {
                    if ($this->_router->isArea($layouts[0])) {
                        $areaPath = $this->_router->getAreaPaths($layouts[0]);
                        $layoutName = $layouts[1];
                    }
                } else {
                    return $this->_router->getApplicationDir() . '/' .
                     $this->_layoutDir;
                }
            } else {
                return $this->_router->getAreaPaths($area) . '/' .
                 $this->_layoutDir;
            }
        }
    }
    /**
     * Lấy ra đường dẫn đến file Layout của Mobile
     * @return mixed string | boolean Trả về chuỗi hoặc false nếu không tìm thấy file mobile layout
     */
    public function getMobileLayoutPath ()
    {
        //Lấy ra folder
        $folder = $this->getLayoutFolder();
        //Lấy ra Application từ Registry và kiểm tra có detect hay không?
        $application = XPHP_Registry::get("Application");
        if ($application->mode == "mobile") {
            //Mobile path
            $mobilePath = $folder . '/' . $this->_layoutFile .
             '.mobile.' . $this->_layoutExt;
            //Device path
            $devicePath = $path = $folder . '/' . $this->_layoutFile .
             '.' . $application->detector->device . '.' . $this->_layoutExt;
            if (is_file($devicePath))
                return $devicePath;
            if (is_file($mobilePath))
                return $mobilePath;
        }
        return false;
    }
}
